/*
 * @Description: 验证
 * @Author: pinus
 * @Email: pinus0716@163.com
 * @Git: https://gitee.com/xyf97
 * @Date: 2021-10-07 15:41:34
 * @LastEditTime: 2021-10-07 21:10:36
 */
const path = require('path')
// 存储服务
global.service_caches = {}
// 存储全局验证函数
global.service_auth_fn = null
/**
 * @description: 设置全局验证函数
 * @param {*} authFn
 * @return {*}
 */
module.exports.setAuthFn = function (authFn) {
  global.service_auth_fn = authFn
}

/**
 * 构造回调对象格式
 *
 * @param {[type]} serviceName   服务名称
 * @param {[type]} actionName    动作名称（方法名）
 * @param {[type]} serviceModule 服务模块
 * @param {[type]} origFunc      原始方法
 */
function Invocation(serviceName, actionName, serviceModule, origFunc) {
  return function () {
    var origArguments = arguments
    return function (req, res, next) {
      if (global.service_auth_fn) {
        global.service_auth_fn(req, res, next, serviceName, actionName, function (pass) {
          if (pass) {
            origFunc.apply(serviceModule, origArguments)
          } else {
            res.sendResult(null, 401, '权限验证失败')
          }
        })
      } else {
        res.sendResult(null, 401, '权限验证失败')
      }
    }
  }
}

/**
 * @description: 获取服务对象（解析服务包含的所有action存放在全局cache中）
 * @param {*} serviceName
 * @return {*}
 */
module.exports.getService = function (serviceName) {
  if (global.service_caches[serviceName]) {
    return global.service_caches[serviceName]
  }

  const serviceModule = require(path.join(process.cwd(), 'services', serviceName))
  if (!serviceModule) {
    console.log('模块没有被发现')
    return null
  }
  global.service_caches[serviceName] = {}

  console.log('*****************************************')
  console.log('创建新服务 => %s', serviceName)
  for (actionName in serviceModule) {
    if (serviceModule && serviceModule[actionName] && typeof serviceModule[actionName] == 'function') {
      var origFunc = serviceModule[actionName]
      global.service_caches[serviceName][actionName] = Invocation(serviceName, actionName, serviceModule, origFunc)
      console.log('action => %s', actionName)
    }
  }
  console.log('*****************************************\n')
  return global.service_caches[serviceName]
}
